<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        const data = [
            {
                id: 1,
                pid: 'a',
                value: "陕西",
                children: [{
                    id: 2,
                    pid: "b",
                    value: "西安",
                    child: [{
                        id: 3,
                        pid: "c",
                        value: "北京",
                    }]
                }],

            },
            {
                id: 4,
                pid: 'd',
                value: "湖南",

            },
            {
                id: 4,
                pid: 'd',
                value: "湖南",
                children: [{
                    id: 5,
                    pid: "e",
                    value: "长沙",
                    child: [{
                        id: 6,
                        pid: "f",
                        value: "上海",
                    }],
                    childdddd: [{
                        id: 9,
                        pid: "f",
                        value: "上海",
                    }]
                }]
            }
        ]
        // console.log([1, 2, 3, 4, 5, [1, 2, 3, 4], [88, 99, 77, 88, 4455, 555]].flat(Infinity))
        // const arr = [
        //     { name: 1, age: 2 },
        //     { name: 1, age: 2 },
        //     { name: 1, age: 2 },
        //     { name: 1, age: 2, obj: { name: 1, age: 2 } }
        // ]
        // console.log(arr.flat(Infinity))
        // console.log(data.flat(Infinity))

        let newarr = []
        for (const [key, item] of data.entries()) {
            for (const valueName in item) {
                if (item[valueName] instanceof Array) {
                    // console.log(item[valueName]);
                    for (const [index, items] of item[valueName].entries()) {
                        // console.log(item[valueName][index]);
                        for (const valuename in item[valueName][index]) {
                            // console.log(item[valueName][index][valuename])
                            if (item[valueName][index][valuename] instanceof Array) {
                                // console.log(item[valueName][index][valuename]);
                                for (const indexs of item[valueName][index][valuename]) {
                                    // console.log(indexs);
                                    newarr.push(indexs)
                                }
                                delete item[valueName][index][valuename]
                            }
                            // newarr.push([valueName][index][valuename])
                        }
                        newarr.push(item[valueName][index])
                    }
                    delete item[valueName]
                }
            }
            newarr.push(item)
        }
        // ----------------------------------------------------------------------------------------------------------
        // function kaobei(newObj, obj) {
        //     for (let item in obj) {
        //         // instanceof作用是判断原型对象中有没有这个方法
        //         if (obj[item] instanceof Array) {
        //             //判断为数组进去判断体
        //             //newObj[item] = []这条代码的意思是newObj.hobby=[],也就是给newObj这个方法新增一个对象，
        //             //无需声明关键词，换一种写法也就是newObj[hobby]=[],对象的另一种表现形式罢了
        //             newObj[item] = []
        //             //kaobei(newObj[item], obj[item])这条代码的意思是kaobei(newObj.hobby, obj.hobby)，
        //             //把数据重新传入进去判断体条件会一直判断下去，
        //             //一直到传进去的 obj.hobby中不再含有引用类型
        //             kaobei(newObj[item], obj[item])
        //         } else if (obj[item] instanceof Object) {
        //             //判断为对象进去判断体
        //             newObj[item] = {}
        //             kaobei(newObj[item], obj[item])
        //         } else {
        //             //进入此判断体则为值类型。非引用类型
        //             newObj[item] = obj[item]
        //         }
        //     }
        // }
        // kaobei(newarr, data)
        console.log(newarr)
    </script>
</body>

</html>